var Comm = {};
Comm.succeed = 1;
Comm.fail = -1;

Comm.trim = function(str){
	return str.replace(/^\s*|\s*$/g,"");
};

Comm.randomString = function(charLength){
	charLength = charLength||8;
	var charList = "abcedfghigklmnopqrstuvwsyz";
	var str = [];
	for(var i=0;i<charLength;i++){
		str.push(charList.charAt(Math.round(Math.random()*100)%charList.length));
	}
	return str.join('');
};

Comm.buildRequestObject = function(action,fieldNames,templateId,tableName,joinTables,condition,orderBy,firstRecord,pageSize,inspectorName,paraObject){
	var actionObject = {"action":action||"","fieldNames":fieldNames||"","templateId":templateId||"","tableName":tableName||"","joinTables":joinTables||"","condition":condition||"","orderBy":orderBy||"","inspectorName":inspectorName||"","currentUser":"#currentUser#","localLanguage":"#localLanguage#"};
	if(firstRecord!==null&&pageSize!==null){
		actionObject.firstRecord = firstRecord;
		actionObject.pageSize = pageSize;
	}
	var requestObject = paraObject||{};
	requestObject.requestAction = actionObject;
	requestObject.serviceUrl = "/service.jsp";
	return requestObject;
};


Comm.convertToJSON = function(requestObject){
	var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
		escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = {'\b': '\\b','\t': '\\t','\n': '\\n','\f': '\\f','\r': '\\r','"' : '\\"','\\': '\\\\'},
        rep;
	function toJSONString(value, replacer, space) {
        var index;
        indent = '';
        if (typeof space === 'number') {
            for (index = 0; index < space; index += 1) {
                indent += ' ';
            }
        }else if (typeof space === 'string'){
            indent = space;
        }
        rep = replacer;
        if (replacer && typeof replacer !== 'function' &&(typeof replacer !== 'object' || typeof replacer.length !== 'number')) {
            throw new Error('JSON.stringify');
        }
        return str('', {'': value});
    }
    function toJSONObject(text, reviver) {
        var j;
        function walk(holder, key) {
            var k, v, value = holder[key];
            if (value && typeof value === 'object') {
                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = walk(value, k);
                        if (v !== undefined) {
                            value[k] = v;
                        } else {
                            delete value[k];
                        }
                    }
                }
            }
            return reviver.call(holder, key, value);
        }
        cx.lastIndex = 0;
        if (cx.test(text)) {
            text = text.replace(cx, function (a) {
                return '\\u' +('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            });
        }
        if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
            j = eval('(' + text + ')');
            return typeof reviver === 'function' ? walk({'': j}, '') : j;
        }
        throw new SyntaxError('JSON.parse');
    }
    function str(key, holder) {
        var i,k,v,length,mind = gap,partial,value = holder[key];
        if (value && typeof value === 'object' && typeof value.toJSON === 'function'){
            value = value.toJSON(key);
        }
        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }
        switch (typeof value) {
	        case 'string':
	            return quote(value);
	        case 'number':
	            return isFinite(value) ? String(value) : 'null';
	        case 'boolean':
	        case 'null':
				return String(value);
	        case 'object':
	            if (!value) {
	                return 'null';
	            }
            gap += indent;
            partial = [];
            if (Object.prototype.toString.apply(value) === '[object Array]') {
                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }
                v = partial.length === 0 ? '[]' : gap!='undefined' ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :'[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }
            if (rep && typeof rep === 'object') {
                length = rep.length;
                for (i = 0; i < length; i += 1) {
                    k = rep[i];
                    if (typeof k === 'string') {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            } else {
                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }
            v = partial.length === 0 ? '{}' : gap!='undefined' ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }
    function quote(string) {
        escapable.lastIndex = 0;
        return escapable.test(string) ?'"' + string.replace(escapable, function (a) {
            var c = meta[a];
            return typeof c === 'string' ? c :'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);}) + '"' :'"' + string + '"';
    }
    if(typeof requestObject === 'string'){
     	return toJSONObject(requestObject);
    }else{
     	return toJSONString(requestObject);
    }
};

Comm.showPopWindow = function(contextPath,title,dataModel,buttonNames,exceptionMessage){
	var popObject = new window["Pops"](contextPath,null);
	if(popObject){
		popObject.dataModel = dataModel;
		popObject.popTitle = title;
		popObject.popButtonNames = buttonNames;
		popObject.popExceptionMessage = exceptionMessage;
		popObject.refresh();
	}
	return popObject;
};

Comm.getLocalString = function(contextPath,key){
	if(!Comm.localStringObject){
		var requestObject = Comm.buildRequestObject(null,null,null,null,null,null,null,null,null,"LocalStringInspector");
		var resultObject = Comm.sendRequest(contextPath,requestObject);
		if(resultObject){
			Comm.localStringObject = resultObject["titleValues"];
		}
	}
	return Comm.localStringObject[key];
};

Comm.findDivById = function(divId){
	var divObject = document.getElementById(divId);
	if(!divObject){
		divObject = document.createElement("DIV");
		divObject.id = divId;
		document.body.appendChild(divObject);
	}
	return divObject;
};

Comm.sendRequest = function(contextPath,requestObject){
    function getXmlHttp(){
		return new window["ActiveXObject"]("Msxml2.XMLHTTP");
	}
	if(!requestObject.serviceUrl||requestObject.serviceUrl===""){
		Comm.showAlert(contextPath,"common.tip.nourl","",null);
		return null;
	}
    var xml="<xml>"+Comm.convertToJSON(requestObject)+"</xml>";
	var xmldoc = new window["ActiveXObject"]("Msxml2.DOMDocument");
	xmldoc.async = false;
	xmldoc.loadXML(xml);
	var xmlhttp = getXmlHttp();
	xmlhttp.open("post",contextPath+requestObject.serviceUrl, false);
	xmlhttp.send(xmldoc);
	var resultObject = Comm.convertToJSON(xmlhttp.responseText);
	if(resultObject&&resultObject.returnFlag==Comm.succeed){
		return resultObject;
	}else{
		Comm.showPopWindow(contextPath,"common.title.failedinfo",resultObject.returnTip,null,resultObject.exceptionMessage);
		return null;
	}
};